package qc.module.demo.api.controller;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import qc.common.core.exception.QCPromptException;
import qc.common.core.utils.DateUtil;
import qc.module.demo.dto.tsnumdata.TSNumDataFixedQueryConditionDto;
import qc.module.demo.dto.tsnumdata.TSNumDataQueryResultDto;
import qc.module.demo.dto.tsnumdata.TsNumDataDto;
import qc.module.demo.dto.tsnumdata.TsNumDataQueryConditionDto;
import qc.module.demo.service.TsNumDataService;

import java.util.Date;
import java.util.List;

/**
 * 时序数值数据
 * @author YRR
 * @create 2025-04-11 14:53
 */
@RestController
@RequestMapping("/tsnumdata")
public class TsNumDataController {

    @Autowired
    private TsNumDataService service;

    /**
     * 条件查询
     *
     * @param condition 查询条件
     * @return List<TsNumDataDto>
     * @throws QCPromptException
     */
    @RequestMapping(value = "/query", method = {RequestMethod.POST, RequestMethod.GET})
    public TSNumDataQueryResultDto query(@RequestBody TsNumDataQueryConditionDto condition) throws QCPromptException {
        return service.query(condition);
    }

    /**
     * 查询指定时间点的点号数据值
     * 查询1个或多个点号数据指定的1个时间点的数据值，指定的时间点自动根据点号的时段长度获取代表的时标时间点（时标时间点均以起始时间表示）；
     * 在查询指定的时间点对应的点号没有数据时，结果集合中也返回该点号（点号ID、名称、数据时标均有值，仅数据值为NaN）；
     *
     * @param condition 指定的点号集合和时间点
     * @return java.util.List<qc.module.demo.dto.tsnumdata.TsNumDataDto>
     * @author QuCheng Tech
     * @since 2025/5/19
     */
    @RequestMapping(value = "/queryfixed", method = {RequestMethod.POST, RequestMethod.GET})
    public TSNumDataQueryResultDto queryFixed(@RequestBody TSNumDataFixedQueryConditionDto condition) throws QCPromptException {
        //在此判断查询条件和进行时间转换
        if (condition == null) throw new QCPromptException("查询条件不能为空");
        if (condition.getPointids() == null) throw new QCPromptException("查询时序数值的点号不能为空");
        if (StringUtils.isBlank(condition.getTm())) throw new QCPromptException("查询时序数值的时间不能为空");
        Date tm = null;
        if (StringUtils.isNotBlank(condition.getTm())) {
            tm = DateUtil.parseDate(condition.getTm());
            if (tm == null) {
                throw new QCPromptException("查询时序数值的时间转换错误");
            }
        }

        return service.queryFixed(condition.getPointids(), tm);
    }

    /**
     * 批量保存
     *
     * @param dtoList
     * @return 返回null 表示成功，否则返回错误信息
     */
    @RequestMapping(value = "/save", method = {RequestMethod.POST, RequestMethod.GET})
    public String save(@RequestBody List<TsNumDataDto> dtoList) {
        return service.save(dtoList);
    }

    /**
     * 批量删除
     * @param dtoList 删除集合数据
     * @return 返回null 表示成功，否则返回错误信息
     */
    @DeleteMapping("/delete")
    public String delete(@RequestBody List<TsNumDataDto> dtoList) {
        return service.delete(dtoList);
    }

    /**
     * 新增1条数据
     *
     * @param dto 指定的数据
     * @return 返回null 表示成功，否则返回错误信息
     */
    @RequestMapping(value = "/update", method = {RequestMethod.PUT, RequestMethod.POST})
    public String update(@RequestBody TsNumDataDto dto) {
        return service.update(dto);
    }

    /**
     * 新增1条数据
     *
     * @param dto 指定的数据
     * @return 返回null 表示成功，否则返回错误信息
     */
    @RequestMapping(value = "/add", method = {RequestMethod.PUT, RequestMethod.POST})
    public String add(@RequestBody TsNumDataDto dto) throws QCPromptException {
        return service.add(dto);
    }
}
